# -*- coding: utf-8 -*-
'''
Created on Nov 4, 2009

@author: rifiorelli
'''

from django.db import models

class Componente(models.Model):
    class Meta:
        ordering = ('-coeficiente_green',)
    MPN = models.CharField(max_length=100, unique=True, verbose_name="Model Product Number (MPN)",)
    nome = models.CharField(max_length=100, unique=True, verbose_name="Nome do Processador",)
    preco = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Preço",)
    consumo_estimado = models.DecimalField(max_digits=10, decimal_places=2,verbose_name="Consumo Estimado",)
    coeficiente_green = models.FloatField(editable=True, blank=True, verbose_name="*Coeficiente Green (cálculo automático)",)
    
    def __unicode__(self):
        return self.nome

class Processador(Componente):
    frequencia = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Frequência",)
    MIPS = models.DecimalField(max_digits=10, decimal_places=0,verbose_name="MIPS",)
    MFLOPS = models.DecimalField(max_digits=10, decimal_places=0,verbose_name="MFLOPS",)
    MOPS = models.DecimalField(max_digits=10, decimal_places=1, editable=True, blank=True, verbose_name="*MOPS (cálculo automático)",)
    
    def save(self, *args, **kwargs):
        self.MOPS = (self.MIPS + self.MFLOPS)/2 # assim conseguimos pegar o valor medio
        self.coeficiente_green = self.MOPS/(self.consumo_estimado*self.preco)
        super(Processador, self).save(*args, **kwargs)

class Memoria(Componente):
    mem = models.IntegerField(verbose_name="Memória (MB)",) # quantidade de memória em MB
    banda = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Banda (MB/s)",)
    
    def save(self, *args, **kwargs):
        self.coeficiente_green = self.banda/(self.consumo_estimado*self.preco)
        super(Memoria, self).save(*args, **kwargs)

class Computador(models.Model):
    class Meta:
        ordering = ('-performance',)
    nome = models.CharField(max_length=100, unique=True, verbose_name="Nome",)
    processador = models.ForeignKey(Processador, verbose_name="Processador",)
    quantidade_processador = models.IntegerField(max_length=1, choices=((u'1','1'),(u'2','2'),(u'3','3'),(u'4','4')), verbose_name="Quantidade de processador",)
    memoria = models.ForeignKey(Memoria, verbose_name="Memória",)
    quantidade_memoria = models.IntegerField(max_length=1, choices=((u'1','1'),(u'2','2'),(u'3','3'),(u'4','4')), verbose_name="Quantidade de memória",)
    TIPO = ((u'S', 'Servidor'),
            (u'W', 'Workstation'),)
    tipo = models.CharField(max_length=2, choices=TIPO, verbose_name="Tipo",)
    custo = models.DecimalField(max_digits=10, decimal_places=2,blank=True,verbose_name="*Custo (cálculo automático)",)
    performance = models.DecimalField(max_digits=10, decimal_places=2,blank=True, verbose_name="*Desempenho (cálculo automático)",)
    consumo_estimado = models.DecimalField(max_digits=10, decimal_places=2,blank=True, verbose_name="*Consumo (cálculo automático)",)
    
    def save(self, *args, **kwargs):
        self.custo = (self.processador.preco*self.quantidade_processador+self.memoria.preco*self.quantidade_memoria)/70*100 # processador+memoria representam 70% do custo total da maquina
        self.consumo_estimado = (self.processador.consumo_estimado*self.quantidade_processador+
                                 self.memoria.consumo_estimado*self.quantidade_memoria)/25*100 # processador+memoria representam 25% do consumo total
        self.performance = str(float(self.processador.MOPS)*(1.35**self.quantidade_processador)) # Considera uma taxa de aumento de performance de 35% para cada processador adicionado
        super(Computador, self).save(*args, **kwargs)
        
    def __unicode__(self):
        return self.nome

class Datacenter(models.Model):
    nome = models.CharField(max_length=100, unique=True,  verbose_name="Nome",)
    servidor = models.ForeignKey(Computador, limit_choices_to = {'tipo': 'S'},  verbose_name="Servidor",) 
    IS_VIRTUALIZADO = ((u'V',  u'Virtualizado'),
                       (u'NV', u'Não Virtualizado'),)
    # Apagar o "virtualizado" pq vamos considerar que inicialmente ele nao eh virtualizado
    virtualizado = models.CharField(max_length=2, choices=IS_VIRTUALIZADO, editable=False)
    numero_servidores_inicial = models.IntegerField(default=15,verbose_name="Número de servidores inicialmente",)
    capacidade_utilizada = models.DecimalField(max_digits=10, decimal_places=2, default=0.4, verbose_name="Taxa de utilização dos servidores",)
    dados_inicial = models.IntegerField(default=20, verbose_name="Dados Inicial (TB)",) # em TB
    percentual_tape = models.DecimalField(max_digits=10, decimal_places=2, default=0.0, verbose_name="Porcentual dos dados em Tape",)
    
    def __unicode__(self):
        return self.nome
    
    def save(self, *args, **kwargs):
        self.virtualizado = 'NV'
        super(Datacenter, self).save(*args, **kwargs)

class AmbienteTrabalho(models.Model):
    nome = models.CharField(max_length=100, unique=True, verbose_name="Nome",)
    workstation = models.ForeignKey(Computador, limit_choices_to = {'tipo': 'W'}, verbose_name="Workstation",) 
    numero_estacoes_inicial = models.IntegerField(default=50, verbose_name="Número de estações inicial",)
    tempo_ligado = models.DecimalField(max_digits=10, decimal_places=2, default=9, verbose_name="Tempo ligado (h)",)
    
    def __unicode__(self):
        return self.nome
    
    def save(self, *args, **kwargs):
        super(AmbienteTrabalho, self).save(*args, **kwargs)

class Solucao(models.Model):
    nome = models.CharField(max_length=100, unique=True, verbose_name="Nome",)
    horizonte = models.IntegerField(default=5, verbose_name="Horizonte Temporal",)
    taxa_aum_processamento = models.DecimalField(max_digits=10,decimal_places=2, default=0.2, verbose_name="Taxa de aumento no processamento",) # taxa de aumento do poder de processamento
    taxa_aum_dados = models.DecimalField(max_digits=10,decimal_places=2,default=0.2, verbose_name="Taxa de aumento no volume de dados",) # taxa de aumento no volume de dados
    taxa_aum_workstation = models.DecimalField(max_digits=10,decimal_places=2, default=0.2, verbose_name="Taxa de aumento em workstation",)
    taxa_desat_servidor = models.DecimalField(max_digits=10,decimal_places=2, default=0.2, verbose_name="Taxa de substituição em servidor",)
    taxa_desat_workstation = models.DecimalField(max_digits=10,decimal_places=2, default=0.2, verbose_name="Taxa de substituição em workstation",)
    custo_kwh = models.DecimalField(max_digits=10,decimal_places=2, default=0.15, verbose_name="Custo KWh (US$)",) # em dolares
    cambio_dolar = models.DecimalField(max_digits=10,decimal_places=2, default=1.8, verbose_name="Câmbio do dolar",)
    meta_tape = models.DecimalField(max_digits=10,decimal_places=2, default=0.2, )
    meta_thin = models.DecimalField(max_digits=10,decimal_places=2, default=0.2, )
    impacto_thin = models.IntegerField(default=1500, verbose_name="Impacto Thin-clients",)
    uso_distrib_eficiente = models.IntegerField(default=1, verbose_name="Uso de distribuição eficiente",)
    IS_VIRTUALIZADO = ((u'V',  u'Virtualizado'),
                       (u'NV', u'Não Virtualizado'),)
    uso_virtualizacao = models.CharField(max_length=2, choices=IS_VIRTUALIZADO, default='NV')
    servidor_novo = models.ForeignKey(Computador, related_name='TIPO', limit_choices_to = {'tipo': 'S'})
    workstation_novo = models.ForeignKey(Computador, limit_choices_to = {'tipo': 'W'})
    
    def __unicode__(self):
        return self.nome
    
    def save(self, *args, **kwargs):
        super(Solucao, self).save(*args, **kwargs)
